package ar.edu.ufasta.presupuestos.servicios.web.netpacks;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Locale;
import java.util.StringTokenizer;

import ar.edu.ufasta.presupuestos.servicios.web.Constantes;

public class InfoPresupuestoResponse extends ResponsePack {

	/**
	 * 
	 */
	private static final long serialVersionUID = 2681420318129360555L;
	private int idPresupuesto;
	private int idCliente;
	private int estadoCode;
	private String nombreCliente;
	private String emailCliente;
	private String telefonoCliente;
	private String estado;
	private String metodoPago;
	private Date fechaEmision;
	private Double total;
	List<Hashtable<String, Object>> detallePresupuesto;
	
	/**
	 * @return the idPresupuesto
	 */
	public int getIdPresupuesto() {
		return idPresupuesto;
	}

	/**
	 * @param idPresupuesto the idPresupuesto to set
	 */
	public void setIdPresupuesto(int idPresupuesto) {
		this.idPresupuesto = idPresupuesto;
	}

	/**
	 * @return the idCliente
	 */
	public int getIdCliente() {
		return idCliente;
	}

	/**
	 * @param idCliente the idCliente to set
	 */
	public void setIdCliente(int idCliente) {
		this.idCliente = idCliente;
	}

	/**
	 * @return the estadoCode
	 */
	public int getEstadoCode() {
		return estadoCode;
	}

	/**
	 * @param estadoCode the estadoCode to set
	 */
	public void setEstadoCode(int estadoCode) {
		this.estadoCode = estadoCode;
	}

	/**
	 * @return the nombreCliente
	 */
	public String getNombreCliente() {
		return nombreCliente;
	}

	/**
	 * @param nombreCliente the nombreCliente to set
	 */
	public void setNombreCliente(String nombreCliente) {
		this.nombreCliente = nombreCliente;
	}

	/**
	 * @return the emailCliente
	 */
	public String getEmailCliente() {
		return emailCliente;
	}

	/**
	 * @param emailCliente the emailCliente to set
	 */
	public void setEmailCliente(String emailCliente) {
		this.emailCliente = emailCliente;
	}

	/**
	 * @return the telefonoCliente
	 */
	public String getTelefonoCliente() {
		return telefonoCliente;
	}

	/**
	 * @param telefonoCliente the telefonoCliente to set
	 */
	public void setTelefonoCliente(String telefonoCliente) {
		this.telefonoCliente = telefonoCliente;
	}

	/**
	 * @return the estado
	 */
	public String getEstado() {
		return estado;
	}

	/**
	 * @param estado the estado to set
	 */
	public void setEstado(String estado) {
		this.estado = estado;
	}

	/**
	 * @return the metodoPago
	 */
	public String getMetodoPago() {
		return metodoPago;
	}

	/**
	 * @param metodoPago the metodoPago to set
	 */
	public void setMetodoPago(String metodoPago) {
		this.metodoPago = metodoPago;
	}

	/**
	 * @return the fechaEmision
	 */
	public Date getFechaEmision() {
		return fechaEmision;
	}

	/**
	 * @param fechaEmision the fechaEmision to set
	 */
	public void setFechaEmision(Date fechaEmision) {
		this.fechaEmision = fechaEmision;
	}

	/**
	 * @return the total
	 */
	public Double getTotal() {
		return total;
	}

	/**
	 * @param total the total to set
	 */
	public void setTotal(Double total) {
		this.total = total;
	}

	/**
	 * @return the detallePresupuesto
	 */
	public List<Hashtable<String, Object>> getDetallePresupuesto() {
		return detallePresupuesto;
	}

	/**
	 * @param detallePresupuesto the detallePresupuesto to set
	 */
	public void setDetallePresupuesto(
			List<Hashtable<String, Object>> detallePresupuesto) {
		this.detallePresupuesto = detallePresupuesto;
	}

	@Override
	public void codificarTrama() {
		trama = "";
		trama = trama + protocol + ";";
		trama = trama + systemCode + ";";
		trama = trama + resultCode + ";";
		if (resultCode == Constantes.TRANSACTION_OK){
			trama = trama + idPresupuesto + ";";
			trama = trama + idCliente + ";";
			trama = trama + estadoCode + ";";
			trama = trama + nombreCliente + ";";
			trama = trama + emailCliente + ";";
			trama = trama + telefonoCliente + ";";
			trama = trama + estado + ";";
			trama = trama + metodoPago + ";";
			SimpleDateFormat simple = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss", Locale.US);
			trama = trama + simple.format(fechaEmision) + ";";
			trama = trama + total +";";
			//---- Detalle Presupuesto ----//
			if (!detallePresupuesto.isEmpty()){
				String dLinea = "";
				for (Iterator<Hashtable<String, Object>> iterator = detallePresupuesto.iterator(); iterator.hasNext();) {
					Hashtable<String, Object> detalleAct = (Hashtable<String, Object>) iterator.next();
					// Armo una fila del detalle
					// IDDetalle|Articulo|Costo Unitario|Cantidad|Total_
					dLinea = "";
					dLinea = dLinea + (Integer)detalleAct.get("dID") + "|";
					dLinea = dLinea + detalleAct.get("dArticulo") + "|";
					dLinea = dLinea + detalleAct.get("dCostoUnitario") + "|";
					dLinea = dLinea + detalleAct.get("dCantidad") + "|";
					dLinea = dLinea + detalleAct.get("dTotal") + "|";
					trama = trama + dLinea + "_";
				}
				trama = trama + ";";
			}else
				trama = trama + " " + ";";
			int checksum = trama.length()+1;
			trama = trama + Integer.toString(checksum) + ";";
			trama = trama + "\n";
		}		
	}

	@Override
	public void decodificarTrama() {
		StringTokenizer st = new StringTokenizer(trama,";");
		st.countTokens();
		try {
			protocol = Integer.valueOf(st.nextToken());
			systemCode = Integer.valueOf(st.nextToken());
			resultCode = Integer.valueOf(st.nextToken());
			if (resultCode == Constantes.TRANSACTION_OK){
				idPresupuesto = Integer.valueOf(st.nextToken());
				idCliente = Integer.valueOf(st.nextToken());
				estadoCode = Integer.valueOf(st.nextToken());
				nombreCliente = st.nextToken();
				emailCliente = st.nextToken();
				telefonoCliente = st.nextToken();
				estado = st.nextToken();
				metodoPago = st.nextToken();
				SimpleDateFormat simpleDate = new SimpleDateFormat("dd-MMM-yyyy HH:mm:ss", Locale.US);
				Date fecha = simpleDate.parse(st.nextToken());
				fechaEmision = fecha;
				total = Double.valueOf(st.nextToken());
				String detallePr = st.nextToken();
				detallePresupuesto = new ArrayList<Hashtable<String, Object>>();
				if (!detallePr.equals(" ")){
					StringTokenizer st2 = new StringTokenizer(detallePr,"_");
					st2.countTokens();
					while (st2.hasMoreTokens()) {
						String filaDetalle = st2.nextToken();
						StringTokenizer st3 = new StringTokenizer(filaDetalle,"|");
						st3.countTokens();
						Hashtable<String, Object> record = new Hashtable<String, Object>();
						// Armo una fila del detalle
						// IDDetalle|Articulo|Costo Unitario|Cantidad|Total_
						record.put("dID", Integer.valueOf(st3.nextToken()));
						record.put("dArticulo", st3.nextToken());
						record.put("dCostoUnitario", Double.valueOf(st3.nextToken()));
						record.put("dCantidad", Integer.valueOf(st3.nextToken()));
						record.put("dTotal", Double.valueOf(st3.nextToken()));
						this.detallePresupuesto.add(record);
					}
				}
			}
		} catch (Exception e) {
			protocol = Constantes.PROTOCOL_100;
			systemCode = Constantes.SYSTEM_CODE;
			resultCode = Constantes.ERROR_OPERATIONCODE;
		}

	}

}
